package dragon.modules.util;

import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import dragon.core.db.DBUtil;
import dragon.core.exception.ExceptionHandler;
import dragon.core.io.FileHandler;
import dragon.core.util.BadWord;
import dragon.core.util.Chinese;
import dragon.core.util.FilePath;
import dragon.model.bizObject.BizObjectContainer;
import dragon.model.fieldTemplate.FieldTemplateContainer;
import dragon.model.table.TableContainer;
import dragon.modules.system.config.dao.SysConfig;
import dragon.modules.system.menu.dao.MenuDaoImpl;

public class Initializer extends HttpServlet {

	private static final Logger logger = LoggerFactory.getLogger(Initializer.class);

	private static final long serialVersionUID = 1L;

	public Initializer() {
		super();
	}

	@Override
	public void destroy() {
		super.destroy();

		if (logger.isDebugEnabled()) {
			logger.debug("资源清理开始");
		}

		// 数据库断开
		DBUtil.close();

		

		if (logger.isDebugEnabled()) {
			logger.debug("资源清理结束");
		}
	}

	@Override
	public void init() throws ServletException {
		if (logger.isDebugEnabled()) {
			logger.debug("初始化系统开始");
		}

		/* 设置web目录 */
		FilePath.setWebRoot(getServletContext().getRealPath(FilePath.separator));

		/********************************************* 加载自定义配置文件 *********************************************************/

		// Step-1 读取配置文件
		InputStream in = FileHandler.getResourceAsStream("webapp.xml");
		if (in == null) {
			logger.error("在class目录下未找到数据库映射文件webapp.xml");
		}

		// Step-2 连接数据库并映射数据文件
		try {
			DBUtil.getDatabase();
			DBUtil.mappingTable(in, true);
		} catch (ExceptionHandler e) {
			logger.error(e.getMessage(), e);
		}

		// Step-3 加载系统参数
		try {
			SysConfig.loadConfig(getServletContext());
		} catch (ExceptionHandler e) {
			logger.error(e.getMessage(), e);
		}


		/***************************************************** 加载资源 ***************************************************************/
		// Step-1 加载汉字
		try {
			Chinese.loadChinese();
		} catch (ExceptionHandler e) {
			logger.error(e.getMessage(), e);
		}

		// Step-2 加载敏感词
		BadWord.loadBadWords();

		/***************************************************** 加载模型数据 ***************************************************************/
		try {
			// Step-1 加载字段模板
			FieldTemplateContainer.loadAll();
			// Step-2 加载数据模型
			TableContainer.loadAll();
			// Step-3 加载业务模型
			BizObjectContainer.loadAll();

			// Step-4 后续处理
			FieldTemplateContainer.afterLoad();
			TableContainer.afterLoad();
			BizObjectContainer.afterLoad();

		} catch (ExceptionHandler e) {
			logger.error(e.getMessage(), e);
		}

		/***************************************************** 注册消息通道 ***************************************************************/
		// ChannelRegistor.regist();

		/***************************************************** 缓存数据 ***************************************************************/
		try {
			MenuDaoImpl.cache();// 系统菜单
		} catch (ExceptionHandler e) {
			logger.error(e.getMessage(), e);
		}

		if (logger.isDebugEnabled()) {
			logger.debug("初始化系统结束");
		}
	}
}
